package com.rongji.dfish.demo.editor.service.uiadaptor;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用于适配gson并把当前组件信息转化成json 以便进行存储/导入导出的的工具。
 * 为了考虑版本兼容，组件信息定义仅仅定义几个标准格式，并不规定具体属性有哪些
 * @author DFish Team
 * @version 1.3
 */
public class ComponentData implements java.lang.Cloneable{
	@Override
	public ComponentData clone()  {
		ComponentData other=new ComponentData();
		other.type=this.type;
		other.mode=this.mode;
		if(this.dataProps!=null)
		other.dataProps=new HashMap<String,String>(this.dataProps);
		if(this.eventProps!=null)
		other.eventProps=new HashMap<String,String>(this.eventProps);
		if(this.hiddensProps!=null)
		other.hiddensProps=new HashMap<String,String>(this.hiddensProps);
		if(this.parentProps!=null)
		other.parentProps=new HashMap<String,String>(this.parentProps);
		if(this.props!=null)
		other.props=new HashMap<String,String>(this.props);
		if(this.nodes!=null){
			other.nodes=new ArrayList<ComponentData>(this.nodes.size());
			for(ComponentData cd:this.nodes){
				other.nodes.add(cd.clone());
			}
		}
		return other;
	}
	/**
	 * 组件的类型 因为这个属性有其特殊的含义。所以独立出来
	 * @return String
	 */
	public String getType() {
		return type;
	}
	/**
	 * 组件的类型 因为这个属性有其特殊的含义。所以独立出来
	 * @param type
	 */
	public void setType(String type) {
		this.type = type;
	}
	/**
	 * 追加到父节点的模式，如果为空一般指默认的追加方式。
	 * 因为有特殊的节点，比如设置默认值 pub这些，程序一般使用独立的方法来处理的。
	 * 有这个标识，即可更加方便，精确的进行选择追加方式
	 * v1.3版本新增
	 * @return String
	 */
	public String getMode() {
		return mode;
	}
	/**
	 * 追加到父节点的模式，如果为空一般指默认的追加方式。
	 * 因为有特殊的节点，比如设置默认值 pub这些，程序一般使用独立的方法来处理的。
	 * 有这个标识，即可更加方便，精确的进行选择追加方式
	 * v1.3版本新增
	 * @param mode
	 */
	public void setMode(String mode) {
		this.mode = mode;
	}
	/**
	 * 控件属性
	 * @return Map
	 */
	public Map<String, String> getProps() {
		return props;
	}
	/**
	 * 控件属性
	 * @param props
	 */
	public void setProps(Map<String, String> props) {
		this.props = props;
	}
	/**
	 * 扩展属性，扩展属性一般当做 数据追加在控件中
	 * @return Map
	 */
	public Map<String, String> getDataProps() {
		return dataProps;
	}
	/**
	 * 扩展属性，扩展属性一般当做 数据追加在控件中
	 * @param dataProps
	 */
	public void setDataProps(Map<String, String> dataProps) {
		this.dataProps = dataProps;
	}
	/**
	 * 事件动作
	 * @return Map
	 */
	public Map<String, String> getEventProps() {
		return eventProps;
	}
	/**
	 * 事件动作
	 * @param eventProps
	 */
	public void setEventProps(Map<String, String> eventProps) {
		this.eventProps = eventProps;
	}
	/**
	 * 隐藏提交的值，隐藏值现在作为多值属性，而不当做子节点处理
	 * @return Map
	 */
	public Map<String, String> getHiddensProps() {
		return hiddensProps;
	}
	/**
	 * 隐藏提交的值，隐藏值现在作为多值属性，而不当做子节点处理
	 * @param hiddensProps
	 */
	public void setHiddensProps(Map<String, String> hiddensProps) {
		this.hiddensProps = hiddensProps;
	}
	/**
	 * 追加属性，追加属性是指追加到父节点的时候，需要额外设置的属性。
	 * @return Map
	 */
	public Map<String, String> getParentProps() {
		return parentProps;
	}
	/**
	 * 追加属性，追加属性是指追加到父节点的时候，需要额外设置的属性。
	 * @param parentProps
	 */
	public void setParentProps(Map<String, String> parentProps) {
		this.parentProps = parentProps;
	}


	/**
	 * 子节点列表
	 * @return List
	 */
	public List<ComponentData> getNodes() {
		return nodes;
	}
	/**
	 * 子节点列表
	 * @param nodes
	 */
	public void setNodes(List<ComponentData> nodes) {
		this.nodes = nodes;
	}
	private String type;
	private String mode;
	private Map<String,String> props;
	private Map<String,String> dataProps;
	private Map<String,String> eventProps;
	private Map<String,String> hiddensProps;
	private Map<String,String> parentProps;
	private List<ComponentData> nodes;

	
}
